#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
正式日报生成命令行工具
生成符合中国领导审阅标准的正式公文格式日报
"""

import argparse
import os
import sys
from datetime import datetime
from pathlib import Path

from loguru import logger


def print_banner():
    """打印程序横幅"""
    print("=" * 60)
    print("          技术工作总结报告生成工具 v2.0")
    print("    基于Git提交记录生成实用的技术工作总结")
    print("=" * 60)


def print_success(message: str):
    """打印成功信息"""
    print(f"\n✅ {message}")


def print_error(message: str):
    """打印错误信息"""
    print(f"\n❌ {message}")


def print_warning(message: str):
    """打印警告信息"""
    print(f"\n⚠️  {message}")


def print_info(message: str):
    """打印信息"""
    print(f"\n📋 {message}")


def load_env_config():
    """加载环境变量配置"""
    try:
        from dotenv import load_dotenv

        # 尝试加载.env文件（先尝试上级目录，再尝试当前目录）
        env_paths = [
            Path(__file__).parent.parent / '.env',  # 上级目录
            Path(__file__).parent / '.env',  # 当前目录
            Path.cwd() / '.env'  # 工作目录
        ]

        for env_path in env_paths:
            if env_path.exists():
                load_dotenv(env_path)
                print_info(f"已加载环境变量文件: {env_path}")
                break
        else:
            print_warning("未找到.env文件，将使用系统环境变量")

    except ImportError:
        print_warning("未安装python-dotenv，将直接读取环境变量")

    return {
        'llm_provider': os.getenv('LLM_PROVIDER', 'ollama').lower(),
        'dashscope_api_key': os.getenv('DASHSCOPE_API_KEY'),
        'qwen_model': os.getenv('QWEN_MODEL', 'qwen-plus'),
        'user_id': os.getenv('DAILY_REPORT_USER_ID'),
        'source_dir': os.getenv('DAILY_REPORT_SOURCE_DIR'),
        'ollama_base_url': os.getenv('OLLAMA_BASE_URL', 'http://localhost:11434'),
        'ollama_model': os.getenv('OLLAMA_MODEL', 'qwen2.5:32b')
    }


def generate_basic_report(year: int, month: int, user_id: str, source_dir: str, output_dir: str = "./reports"):
    """生成基础正式日报（不使用AI）"""
    try:
        from daily_report_generator import DailyReportGenerator

        generator = DailyReportGenerator(source_dir, user_id)

        # 使用新的正式报告格式
        report = generator.generate_official_monthly_report(year, month)

        # 保存报告
        output_path = Path(output_dir)
        output_path.mkdir(parents=True, exist_ok=True)

        output_file = output_path / f"{year}-{month:02d}_official_report.md"

        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(report)

        print_success(f"正式基础报告生成完成")
        print_info(f"文件路径: {output_file}")
        return str(output_file)

    except Exception as e:
        print_error(f"生成基础报告时出错: {e}")
        logger.exception("详细错误信息:")
        return None


def generate_daily_detailed_report(year: int, month: int, user_id: str, source_dir: str, output_dir: str = "./reports"):
    """生成每日详细工作报告 - 为每天生成单独的文件"""
    try:
        from daily_report_generator import DailyReportGenerator

        generator = DailyReportGenerator(source_dir, user_id)

        # 生成每日单独文件
        generated_files = generator.generate_daily_separate_files(year, month, output_dir)

        if not generated_files:
            print_warning(f"{year}年{month}月无提交记录，未生成任何报告文件")
            return None

        print_success(f"每日报告生成完成，共生成 {len(generated_files)} 个文件")
        for file_path in generated_files:
            print_info(f"文件路径: {file_path}")
        
        return generated_files

    except Exception as e:
        print_error(f"生成每日详细报告时出错: {e}")
        logger.exception("详细错误信息:")
        return None


def generate_ai_report(year: int, month: int, user_id: str, source_dir: str,
                       llm_provider: str, llm_config: dict, output_dir: str = "./reports"):
    """生成AI增强的技术工作总结报告"""
    try:
        from ai_daily_report import AIDailyReportGenerator

        generator = AIDailyReportGenerator(llm_provider, llm_config, source_dir, user_id)

        print_info("正在连接AI模型，生成技术工作总结报告...")
        reports = generator.generate_full_monthly_ai_reports(year, month)

        # 保存报告
        output_path = Path(output_dir)
        output_path.mkdir(parents=True, exist_ok=True)

        saved_files = []

        for report_type, content in reports.items():
            if report_type == 'monthly_summary':
                filename = f"{year}-{month:02d}_AI_technical_summary.md"
            else:
                filename = f"{year}-{month:02d}_AI_technical_daily_reports.md"

            output_file = output_path / filename

            with open(output_file, 'w', encoding='utf-8') as f:
                f.write(content)

            saved_files.append(str(output_file))

        print_success(f"AI技术工作报告生成完成，共 {len(saved_files)} 个文件")
        for file_path in saved_files:
            print_info(f"文件路径: {file_path}")

        return saved_files

    except Exception as e:
        print_error(f"生成AI报告时出错: {e}")
        logger.exception("详细错误信息:")
        return None


def main():
    """主函数"""
    print_banner()

    parser = argparse.ArgumentParser(
        description='技术工作总结报告生成工具 - 基于Git提交记录生成实用的技术工作总结',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
使用示例:
  # 生成当前月份的AI技术工作总结
  python generate_daily_report.py
  
  # 生成每日详细工作报告（用户最关键需求！）
  python generate_daily_report.py --daily-detailed
  
  # 生成指定月份的每日详细报告
  python generate_daily_report.py --daily-detailed --year 2024 --month 12
  
  # 使用DashScope（通义千问）生成AI报告
  python generate_daily_report.py --llm-provider dashscope --model qwen-plus
  
  # 使用Ollama本地模型生成AI报告
  python generate_daily_report.py --llm-provider ollama --model qwen2.5:32b
  
  # 生成指定月份的AI技术工作总结
  python generate_daily_report.py --year 2024 --month 10
  
  # 只生成基础技术工作报告（不使用AI）
  python generate_daily_report.py --basic-only
  
  # 只生成AI增强技术工作总结
  python generate_daily_report.py --ai-only
  
  # 指定用户和目录
  python generate_daily_report.py --user-id gaoyussdut --source-dir /Users/gaoyu/source_code
        """
    )

    parser.add_argument('--year', type=int, default=datetime.now().year, help='年份（默认当前年）')
    parser.add_argument('--month', type=int, default=datetime.now().month, help='月份（默认当前月）')
    parser.add_argument('--user-id', type=str, help='用户ID（默认从环境变量读取）')
    parser.add_argument('--source-dir', type=str, help='源代码目录（默认从环境变量读取）')
    parser.add_argument('--output-dir', type=str, default='./reports', help='输出目录（默认./reports）')
    parser.add_argument('--basic-only', action='store_true', help='只生成基础技术工作报告，不使用AI')
    parser.add_argument('--ai-only', action='store_true', help='只生成AI增强技术工作总结')
    parser.add_argument('--daily-detailed', action='store_true', help='生成每日详细工作报告（用户最关键需求！）')
    parser.add_argument('--llm-provider', type=str, choices=['dashscope', 'ollama'],
                        help='LLM提供商选择：dashscope（通义千问）或ollama（本地模型）')
    parser.add_argument('--model', type=str, help='指定模型名称（如qwen-plus, qwen2.5:32b等）')

    args = parser.parse_args()

    # 加载配置
    config = load_env_config()

    user_id = args.user_id or config['user_id']
    source_dir = args.source_dir or config['source_dir']

    print_info(f"配置信息检查")
    print(f"   年份: {args.year}")
    print(f"   月份: {args.month}")
    print(f"   用户ID: {user_id}")
    print(f"   源代码目录: {source_dir}")
    print(f"   输出目录: {args.output_dir}")

    if not user_id:
        print_error("请指定用户ID（通过--user-id参数或DAILY_REPORT_USER_ID环境变量）")
        sys.exit(1)

    if not source_dir:
        print_error("请指定源代码目录（通过--source-dir参数或DAILY_REPORT_SOURCE_DIR环境变量）")
        sys.exit(1)

    if not Path(source_dir).exists():
        print_error(f"源代码目录不存在: {source_dir}")
        sys.exit(1)

    print_info(f"开始生成 {args.year}年{args.month}月 技术工作总结报告")

    success = False
    generated_files = []

    # 生成每日详细工作报告（用户最关键需求！）
    if args.daily_detailed:
        print_info("正在生成每日详细工作报告...")
        daily_file = generate_daily_detailed_report(args.year, args.month, user_id, source_dir, args.output_dir)
        if daily_file:
            success = True
            generated_files.append(daily_file)
        # 如果只要求生成每日详细报告，则直接跳到结果输出
        if args.daily_detailed and not args.basic_only and not args.ai_only:
            # 输出最终结果
            print("\n" + "=" * 60)
            if success:
                print_success("每日详细工作报告生成完成！")
                print_info(f"共生成 {len(generated_files)} 个文件:")
                for i, file_path in enumerate(generated_files, 1):
                    # 确保file_path是字符串类型
                    if isinstance(file_path, (list, tuple)):
                        file_path = str(file_path[0]) if file_path else "unknown"
                    file_path_str = str(file_path)
                    print(f"   {i}. {Path(file_path_str).name}")
                print_info(f"输出目录: {args.output_dir}")

                # 提供查看建议
                print_info("建议操作:")
                print("   1. 查看生成的每日详细报告文件")
                print("   2. 根据需要进行格式调整")
                print("   3. 用于日常工作总结和汇报")
            else:
                print_error("每日详细报告生成失败")
            print("=" * 60)
            return

    # 生成基础技术工作报告
    if not args.ai_only and not args.daily_detailed:
        print_info("正在生成基础技术工作报告...")
        basic_file = generate_basic_report(args.year, args.month, user_id, source_dir, args.output_dir)
        if basic_file:
            success = True
            generated_files.append(basic_file)

    # 生成AI增强技术工作报告
    if not args.basic_only:
        print_info("正在生成AI增强技术工作报告...")
        try:
            # 准备LLM配置 - 命令行参数优先于环境变量
            llm_provider = args.llm_provider or config.get('llm_provider', 'ollama')
            llm_config = {}

            if llm_provider == 'dashscope':
                model_name = args.model or config.get('qwen_model', 'qwen-plus')
                llm_config = {
                    'api_key': config.get('dashscope_api_key'),
                    'model': model_name
                }
                print_info(f"使用DashScope模型: {model_name}")
            elif llm_provider == 'ollama':
                model_name = args.model or config.get('ollama_model', 'qwen2.5:32b')
                llm_config = {
                    'base_url': config.get('ollama_base_url', 'http://localhost:11434'),
                    'model': model_name
                }
                print_info(f"使用Ollama模型: {model_name}")

            ai_files = generate_ai_report(
                args.year, args.month, user_id, source_dir,
                llm_provider, llm_config, args.output_dir
            )
            if ai_files:
                success = True
                generated_files.extend(ai_files)
        except ImportError as e:
            print_warning(f"无法生成AI报告，缺少依赖: {e}")
            print_info("请安装依赖: pip install langchain langchain-community dashscope python-dotenv")
        except Exception as e:
            print_error(f"生成AI报告时出错: {e}")
            logger.exception("详细错误信息:")

    # 输出最终结果
    print("\n" + "=" * 60)
    if success:
        print_success("正式日报生成完成！")
        print_info(f"共生成 {len(generated_files)} 个文件:")
        for i, file_path in enumerate(generated_files, 1):
            print(f"   {i}. {Path(file_path).name}")
        print_info(f"输出目录: {args.output_dir}")

        # 提供查看建议
        print_info("建议操作:")
        print("   1. 查看生成的正式报告文件")
        print("   2. 根据需要进行格式调整")
        print("   3. 提交给相关领导审阅")
    else:
        print_error("正式日报生成失败")
        print_info("请检查:")
        print("   1. 网络连接是否正常")
        print("   2. Ollama服务是否运行")
        print("   3. 源代码目录是否包含Git仓库")
        print("   4. 用户ID是否正确")
        sys.exit(1)

    print("=" * 60)


if __name__ == "__main__":
    main()
